package modelo.test;

import java.util.Iterator;

import junit.framework.TestCase;
import junit.framework.TestSuite;
import modelo.enemigos.Arana;
import modelo.enemigos.CreadorEnemigo;
import modelo.enemigos.CreadorHormiga;
import modelo.enemigos.Enemigo;
import modelo.enemigos.ManejadorEnemigos;
import modelo.enemigos.Mosca;
import modelo.juego.Configuracion;
import modelo.juego.Jugador;
import modelo.mapa.Casillero;
import modelo.mapa.Mapa;
import modelo.obstaculos.CreadorObstaculoPegote;
import modelo.obstaculos.CreadorObstaculoArena;
import modelo.obstaculos.ManejadorObstaculos;
import modelo.obstaculos.Obstaculo;
import modelo.obstaculos.ObstaculoArena;
import modelo.obstaculos.ObstaculoPegote;

public class PruebaObstaculo extends TestCase {

	private Mapa m = new Mapa(20);
	private Jugador j = new Jugador();
	private CreadorEnemigo cEnemigo = new CreadorHormiga();
	private ManejadorEnemigos me = new ManejadorEnemigos(m, j, 15, cEnemigo);
	private ManejadorObstaculos mo = new ManejadorObstaculos(m, me, j);

	public void testCrearObstaculoPegote() {
		Casillero c = m.GetCasilleroXY(3, 4);

		Obstaculo obstaculo = new ObstaculoPegote(mo);
		m.posicionarPosicionable(c, obstaculo);
		assertEquals(Configuracion.COSTO_PEGOTE, obstaculo.getCosto());
		assertEquals(c, obstaculo.getCasillero());
		m.removerPosicionable(obstaculo);

	}

	public void testCrearObstaculoArena() {
		Casillero c = m.GetCasilleroXY(3, 4);

		Obstaculo obstaculo = new ObstaculoArena(mo);
		m.posicionarPosicionable(c, obstaculo);
		assertEquals(Configuracion.COSTO_ARENA, obstaculo.getCosto());
		assertEquals(c, obstaculo.getCasillero());
		m.removerPosicionable(obstaculo);

	}

	public void testSimularJuego() {
		j.modificarDinero(500);
		Casillero c1 = m.GetCasilleroXY(3, 4);
		c1.setEsCamino(true);
		Enemigo e1 = new Arana(c1);

		Casillero c2 = m.GetCasilleroXY(3, 4);
		Enemigo e2 = new Mosca(c2);

		Casillero c3 = m.GetCasilleroXY(4, 5);
		c3.setEsCamino(true);
		Enemigo e3 = new Arana(c3);

		Casillero c6 = m.GetCasilleroXY(3, 4);
		c6.setEsCamino(true);
		Enemigo e6 = new Arana(c6);

		m.posicionarPosicionable(c1, e1);
		m.posicionarPosicionable(c2, e2);
		m.posicionarPosicionable(c3, e3);
		m.posicionarPosicionable(c6, e6);

		Casillero c4 = m.GetCasilleroXY(3, 4);
		Casillero c5 = m.GetCasilleroXY(4, 5);
		mo.crearObstaculo(c4, new CreadorObstaculoPegote());

		assertTrue(!(mo.getObstaculos().isEmpty()));

		Obstaculo o1 = new ObstaculoPegote(mo);
		Obstaculo o2 = new ObstaculoArena(mo);
		mo.crearObstaculo(c4, new CreadorObstaculoPegote());

		
		mo.crearObstaculo(c5, new CreadorObstaculoArena());

		mo.getObstaculos().add(o1);
		m.posicionarPosicionable(c4, o1);
		mo.getObstaculos().add(o2);
		m.posicionarPosicionable(c5, o2);

		Iterator itObstaculos = mo.getObstaculos().iterator();


		mo.latir();

		assertEquals(2, o1.getEfectos().size()); // Solo afecta 2 enemigos
													// porque uno es volador
		assertEquals(1, o2.getEfectos().size());

	}

	public static TestSuite suite() {
		TestSuite suite = new TestSuite();
		suite.addTestSuite(PruebaObstaculo.class);
		return suite;
	}

}
